์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ, ๋ค์ํ ๊ธฐ๊ธฐ์ ํ๋ซํผ์์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
ํ๋ฉด ๋ฐฉํฅ ๋ง์คํฐํ๊ธฐ: ๊ธฐ๊ธฐ ํ์ ์ฒ๋ฆฌ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋
์ค๋๋ ๊ณผ ๊ฐ์ ๋ค์ค ๊ธฐ๊ธฐ ์๋์๋ ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ํ๋ฉด ๋ฐฉํฅ์ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ค๋งํธํฐ, ํ๋ธ๋ฆฟ, ์ฌ์ง์ด ํด๋๋ธ ๊ธฐ๊ธฐ์ ์ด๋ฅด๊ธฐ๊น์ง, ์ฌ์ฉ์๋ค์ ๊ธฐ๊ธฐ๋ฅผ ํ์ ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํํ๊ฒ ์ ์ํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ๋ค์ํ ํ๋ซํผ๊ณผ ๊ธฐ์ ์ ๋ค๋ฃจ๋ฉฐ ๊ธฐ๊ธฐ ํ์ ์ฒ๋ฆฌ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ฌ, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ํ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ด ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
ํ๋ฉด ๋ฐฉํฅ ์ดํดํ๊ธฐ
ํ๋ฉด ๋ฐฉํฅ์ ๊ธฐ๊ธฐ ํ๋ฉด์ ์ฝํ ์ธ ๊ฐ ํ์๋๋ ๋ฐฉํฅ์ ์๋ฏธํฉ๋๋ค. ์ฃผ์ ๋ ๊ฐ์ง ๋ฐฉํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ธ๋ก ๋ชจ๋(Portrait): ํ๋ฉด์ด ๋๋น๋ณด๋ค ๋์ด๊ฐ ๋ ๊น๋๋ค. ์ด๋ ์ค๋งํธํฐ์ ์ผ๋ฐ์ ์ธ ๋ฐฉํฅ์ ๋๋ค.
- ๊ฐ๋ก ๋ชจ๋(Landscape): ํ๋ฉด์ด ๋์ด๋ณด๋ค ๋๋น๊ฐ ๋ ๋์ต๋๋ค. ๋์์์ ๋ณด๊ฑฐ๋ ๊ฒ์์ ํ ๋ ์์ฃผ ์ ํธ๋ฉ๋๋ค.
์ผ๋ถ ๊ธฐ๊ธฐ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์๋ ์ง์ํฉ๋๋ค:
- ์ญ ์ธ๋ก ๋ชจ๋(Reverse Portrait): ๊ธฐ๊ธฐ๋ฅผ 180๋ ํ์ ํ ์ธ๋ก ๋ชจ๋์ ๋๋ค.
- ์ญ ๊ฐ๋ก ๋ชจ๋(Reverse Landscape): ๊ธฐ๊ธฐ๋ฅผ 180๋ ํ์ ํ ๊ฐ๋ก ๋ชจ๋์ ๋๋ค.
ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ด์
ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค:
- ๋ ์ด์์ ๋ฌธ์ : ์์๋ค์ด ์ ๋ ฌ์ด ๋ง์ง ์๊ฑฐ๋, ์๋ฆฌ๊ฑฐ๋, ์๋ก ๊ฒน์น ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์์ค: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์กํฐ๋นํฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
- ๋์ ์ฌ์ฉ์ ๊ฒฝํ: ๋ถ์์ฐ์ค๋ฝ๊ฑฐ๋ ๊นจ์ง ๊ฒฝํ์ ์ฌ์ฉ์๋ฅผ ์ข์ ์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ํํ์ ์์์ํฌ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ์ฆ์ ์ฌ๋ ๋๋ง๊ณผ ๋ ์ด์์ ๊ณ์ฐ์ ํนํ ๊ตฌํ ๊ธฐ๊ธฐ์์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๋ค์ํ ํ๋ซํผ์์ ํ๋ฉด ๋ฐฉํฅ ์ฒ๋ฆฌํ๊ธฐ
ํ๋ฉด ๋ฐฉํฅ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ ์ ๊ฐ๋ฐํ๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช๋ช ํ๋ซํผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ์๋๋ก์ด๋
์๋๋ก์ด๋๋ ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
a. ๊ตฌ์ฑ ๋ณ๊ฒฝ(Configuration Changes)
๊ธฐ๋ณธ์ ์ผ๋ก ์๋๋ก์ด๋๋ ํ๋ฉด ๋ฐฉํฅ์ด ๋ณ๊ฒฝ๋ ๋ ์กํฐ๋นํฐ(Activity)๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค. ์ด๋ `onCreate()` ๋ฉ์๋๊ฐ ๋ค์ ํธ์ถ๋๊ณ ์ ์ฒด ๋ ์ด์์์ด ๋ค์ ๋ก๋๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ UI๋ฅผ ์์ ํ ์ฌ๊ตฌ์ฑํ๋ ๋ฐ ์ ์ฉํ ์ ์์ง๋ง, ๋ ์ด์์์ ์ฝ๊ฐ๋ง ์กฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
์กํฐ๋นํฐ๊ฐ ๋ค์ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด, `AndroidManifest.xml` ํ์ผ์์ ์กํฐ๋นํฐ๊ฐ `orientation` ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๋ค๊ณ ์ ์ธํ ์ ์์ต๋๋ค:
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize"
... >
</activity>
`orientation`๊ณผ `screenSize`(API ๋ ๋ฒจ 13 ์ด์์์ ์ค์)๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ, ์์คํ ์ ์กํฐ๋นํฐ๊ฐ ์ง์ ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ ๊ฒ์์ ์๋ฆฌ๋ ๊ฒ์ ๋๋ค. ํ๋ฉด์ด ํ์ ํ๋ฉด `onConfigurationChanged()` ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Check the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
`onConfigurationChanged()` ๋ด๋ถ์์ ์๋ก์ด ๋ฐฉํฅ์ ๋ฐ๋ผ UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ถํ์ํ ๋ฆฌ์์ค ๋ก๋ฉ๊ณผ ๋ ์ด์์ ์ธํ๋ ์ด์ ์ ํผํ๊ธฐ ๋๋ฌธ์ ์กํฐ๋นํฐ๋ฅผ ๋ค์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ ๋๋ค.
b. ์กํฐ๋นํฐ ์ํ ์ ์ฅ ๋ฐ ๋ณต์
๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ง์ ์ฒ๋ฆฌํ๋๋ผ๋ ์กํฐ๋นํฐ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์กํฐ๋นํฐ์ ํ ์คํธ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ํ์ ํ ๋ ์ ๋ ฅํ ํ ์คํธ๋ฅผ ๋ณด์กดํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
`onSaveInstanceState()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์กํฐ๋นํฐ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ `onRestoreInstanceState()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ํ ์ ์์ต๋๋ค.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString("my_text", myTextView.getText().toString());
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String myText = savedInstanceState.getString("my_text");
myTextView.setText(myText);
}
๋๋, ๊ตฌ์ฑ ๋ณ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์ณ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์งํ๊ธฐ ์ํด SavedStateHandle๊ณผ ํจ๊ป ViewModel์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ ํ๋์ ์ด๊ณ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
c. ๋์ฒด ๋ ์ด์์
์๋๋ก์ด๋๋ ํ๋ฉด ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ ์ด์์ ํ์ผ์ ์ ๊ณตํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. `res/layout-land/` ๋ฐ `res/layout-port/` ๋๋ ํฐ๋ฆฌ์ ๋ณ๋์ ๋ ์ด์์ ํ์ผ์ ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ฉด์ด ํ์ ํ๋ฉด ์๋๋ก์ด๋๋ ์๋์ผ๋ก ์ ์ ํ ๋ ์ด์์ ํ์ผ์ ๋ก๋ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ UI๊ฐ ๊ฐ๋ก ๋ฐ ์ธ๋ก ๋ฐฉํฅ์์ ์๋นํ ๋ฌ๋ผ์ ธ์ผ ํ ๋ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ก ๋ชจ๋์์๋ 2๊ฐ์ ํจ๋ ๋ ์ด์์์, ์ธ๋ก ๋ชจ๋์์๋ ๋จ์ผ ํจ๋ ๋ ์ด์์์ ํ์ํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
d. ConstraintLayout ์ฌ์ฉ
ConstraintLayout์ ์ ์ฐํ๊ณ ์ ์์ฑ ์๋ ๋ ์ด์์์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋ ์ด์์ ๊ด๋ฆฌ์์ ๋๋ค. ConstraintLayout์ ์ฌ์ฉํ๋ฉด ๋ทฐ๊ฐ ์๋ก ๋ฐ ๋ถ๋ชจ ๋ ์ด์์์ ๋ํด ์ด๋ป๊ฒ ์์นํด์ผ ํ๋์ง๋ฅผ ์ง์ ํ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ์ ์ํ๋ ๋ ์ด์์์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด์ค๋๋ค.
2. iOS
iOS ๋ํ ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค:
a. ์คํ ๋ ์ด์์(Auto Layout)
์คํ ๋ ์ด์์์ ๋ทฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ๊ท์น์ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์ ์ฝ ์กฐ๊ฑด ๊ธฐ๋ฐ ๋ ์ด์์ ์์คํ ์ ๋๋ค. ์คํ ๋ ์ด์์ ์ ์ฝ ์กฐ๊ฑด์ UI๊ฐ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ์ ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์คํ ๋ ์ด์์์ ์ฌ์ฉํ ๋, ์ผ๋ฐ์ ์ผ๋ก ๋ทฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ง์ ํ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฒํผ์ ๋ถ๋ชจ ๋ทฐ ๋ด์์ ๊ฐ๋ก ๋ฐ ์ธ๋ก๋ก ์ค์์ ์ค๋๋ก ์ ์ฝํ ์ ์์ต๋๋ค. ํ๋ฉด์ด ํ์ ํ๋ฉด ์คํ ๋ ์ด์์ ์์ง์ ์ ์ฝ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๊ธฐ ์ํด ๋ทฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๋ค์ ๊ณ์ฐํฉ๋๋ค.
b. ์ฌ์ด์ฆ ํด๋์ค(Size Classes)
์ฌ์ด์ฆ ํด๋์ค๋ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๋ถ๋ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. iOS๋ `Compact`์ `Regular` ๋ ๊ฐ์ง ์ฌ์ด์ฆ ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ๊ธฐ๋ ๋๋น์ ๋์ด์ ๋ํด ๋ค๋ฅธ ์ฌ์ด์ฆ ํด๋์ค๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ๋ก ๋ฐฉํฅ์ ์์ดํฐ์ `Compact` ๋๋น ์ฌ์ด์ฆ ํด๋์ค์ `Regular` ๋์ด ์ฌ์ด์ฆ ํด๋์ค๋ฅผ ๊ฐ์ง๋๋ค. ๊ฐ๋ก ๋ฐฉํฅ์์๋ ๋ชจ๋ธ์ ๋ฐ๋ผ `Compact` ๋์ด์ `Compact` ๋๋ `Regular` ๋๋น๋ฅผ ๊ฐ์ง๋๋ค.
์ฌ์ด์ฆ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๋ฐ๋ผ UI๋ฅผ ๋ง์ถค ์ค์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ์ฌ์ด์ฆ ํด๋์ค์ ๋ํด ๋ค๋ฅธ ๋ทฐ ์ธํธ๋ฅผ ํ์ํ๊ฑฐ๋ ๋ค๋ฅธ ๊ธ๊ผด์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ๋น๋์์ ์ง์ ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ด์ฆ ํด๋์ค์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ์ฝ ์กฐ๊ฑด์ ๊ตฌ์ฑํ๊ณ ๋ทฐ๋ฅผ ์ค์น/์ ๊ฑฐํ ์ ์์ต๋๋ค.
c. ๋ทฐ ์ปจํธ๋กค๋ฌ ํ์ ๋ฉ์๋
iOS๋ ๊ธฐ๊ธฐ๊ฐ ํ์ ํ ๋ ํธ์ถ๋๋ UIViewController ํด๋์ค์ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator): ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊ฐ ์ ํ์ ์ํด ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค.viewWillLayoutSubviews(): ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊ฐ ํ์ ๋ทฐ๋ค์ ๋ฐฐ์นํ๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค.viewDidLayoutSubviews(): ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊ฐ ํ์ ๋ทฐ๋ค์ ๋ฐฐ์นํ ์งํ์ ํธ์ถ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ํ๋ฉด์ด ํ์ ํ ๋ ์ฌ์ฉ์ ์ง์ ๋ ์ด์์ ์กฐ์ ์ ์ํํ ์ ์์ต๋๋ค.
d. Notification Center
Notification Center๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉํฅ ๋ณ๊ฒฝ ์๋ฆผ์ ์์ ํ ์ ์์ต๋๋ค:
NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: UIDevice.orientationDidChangeNotification, object: nil)
@objc func orientationChanged() {
if UIDevice.current.orientation.isLandscape {
print("Landscape")
} else {
print("Portrait")
}
}
3. ์น ๊ฐ๋ฐ (HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ)
์น ๊ฐ๋ฐ์์๋ CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
a. CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด ํฌ๊ธฐ, ๋ฐฉํฅ ๋ฐ ๊ธฐํ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. `orientation` ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํน์ ๋ฐฉํฅ์ ํ๊ฒํ ํ ์ ์์ต๋๋ค.
/* ์ธ๋ก ๋ชจ๋ */
@media (orientation: portrait) {
body {
background-color: lightblue;
}
}
/* ๊ฐ๋ก ๋ชจ๋ */
@media (orientation: landscape) {
body {
background-color: lightgreen;
}
}
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ ์ด์์, ๊ธ๊ผด ๋ฐ ๊ธฐํ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
b. ์๋ฐ์คํฌ๋ฆฝํธ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ฌ์ฉ์ ์ง์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. `screen.orientation` API๋ ํ์ฌ ๋ฐฉํฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
function handleOrientationChange() {
if (screen.orientation.type === "landscape-primary" || screen.orientation.type === "landscape-secondary") {
console.log("Landscape");
} else if (screen.orientation.type === "portrait-primary" || screen.orientation.type === "portrait-secondary") {
console.log("Portrait");
} else {
console.log("Unknown orientation");
}
}
window.addEventListener("orientationchange", handleOrientationChange);
๋๋, ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํจ๊ป `matchMedia` API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
const landscapeMediaQuery = window.matchMedia("(orientation: landscape)");
function handleOrientationChange(event) {
if (event.matches) {
console.log("Landscape");
} else {
console.log("Portrait");
}
}
landscapeMediaQuery.addEventListener("change", handleOrientationChange);
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ ์ด์์์ ์กฐ์ ํ๊ฑฐ๋, ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๊ฑฐ๋, ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
c. ๋ฐ์ํ ๋์์ธ ํ๋ ์์ํฌ
Bootstrap, Foundation, Materialize CSS์ ๊ฐ์ ํ๋ ์์ํฌ๋ ๋ฐ์ํ ๋์์ธ์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ์ ์ํ๋ ๋ ์ด์์์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ํ๋ ์์ํฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์์คํ ๊ณผ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฐํ๊ณ ๋ฐ์์ ์ธ UI๋ฅผ ๋ง๋ญ๋๋ค.
ํ๋ฉด ๋ฐฉํฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ ๋ ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถํ์ํ ์กํฐ๋นํฐ/๋ทฐ ์ปจํธ๋กค๋ฌ ์ฌ์์ฑ ํผํ๊ธฐ: ๊ฐ๋ฅํ๋ค๋ฉด, ์กํฐ๋นํฐ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์์ฑํ๋ ์ค๋ฒํค๋๋ฅผ ํผํ๊ธฐ ์ํด ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ง์ ์ฒ๋ฆฌํ์ธ์.
- ์ํ ์ ์ฅ ๋ฐ ๋ณต์: ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ํญ์ ์กํฐ๋นํฐ/๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ์ธ์. ๋ ๊ฐ๋ ฅํ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ViewModel์ ์ฌ์ฉํ์ธ์.
- ์คํ ๋ ์ด์์ ๋๋ ConstraintLayout ์ฌ์ฉ: ์ด๋ฌํ ๋ ์ด์์ ์์คํ ์ ์ ์ฐํ๊ณ ์ ์์ฑ ์๋ ๋ ์ด์์์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ํ ์คํธํ๊ธฐ: ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๊ฐ์ง ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ธ์.
- ์ ๊ทผ์ฑ ๊ณ ๋ คํ๊ธฐ: ํ๋ฉด์ด ํ์ ํ ๋ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์.
- ๋ช ํํ ์๊ฐ์ ๋จ์ ์ ๊ณตํ๊ธฐ: ํ๋ฉด ํ์ ์ UI๊ฐ ํฌ๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ช ํํ ์๊ฐ์ ๋จ์๋ฅผ ์ ๊ณตํ์ธ์.
- ํน์ ๋ฐฉํฅ ๊ฐ์ ํ์ง ์๊ธฐ(ํ์ํ ๊ฒฝ์ฐ ์ ์ธ): ๊ฐ๋ฅํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ๋ฐฉํฅ์ผ๋ก ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํ์ธ์. ๋ฐฉํฅ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋ถํธํ๊ณ ์ข์ ๊ฐ์ ์ค ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ์ ํ์์ ์ธ ๊ฒฝ์ฐ(์: ๊ฐ๋ก ๋ชจ๋๊ฐ ํ์ํ ๊ฒ์)์๋ง ๋ฐฉํฅ์ ๊ณ ์ ํ์ธ์. ๋ฐฉํฅ์ ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ๊ทธ ์ด์ ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ช ํํ๊ฒ ์ ๋ฌํ์ธ์.
- ์ฑ๋ฅ ์ต์ ํ: ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ํ๋ฉด์ด ํ์ ํ ๋ ์ํํด์ผ ํ๋ ์์ ์ ์์ ์ต์ํํ์ธ์.
- ์๋ ๋จ์ ์ฌ์ฉ: ๋ ์ด์์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ์ ์ํ ๋, UI๊ฐ ๋ค๋ฅธ ํ๋ฉด ํฌ๊ธฐ์์ ์ ๋๋ก ํ์ฅ๋๋๋ก ํฝ์ ๊ณผ ๊ฐ์ ์ ๋ ๋จ์ ๋์ ๋ฐฑ๋ถ์จ, `dp`, `sp`์ ๊ฐ์ ์๋ ๋จ์๋ฅผ ์ฌ์ฉํ์ธ์.
- ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ ํ์ฉ: ๋ฐ์ํ ๋์์ธ ๋ฐ ํ๋ฉด ๋ฐฉํฅ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ธ์.
๋ฐฉํฅ ๊ณ ์ ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ๊ธฐ๊ธฐ๋ฅผ ํ์ ํ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ง๋ง, ํ๋ฉด ๋ฐฉํฅ์ ๊ณ ์ ํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฒด ํ๋ฉด ๋น๋์ค ํ๋ ์ด์ด๋ ์ต์ ์ ์์ฒญ์ ์ํด ๋ฐฉํฅ์ ๊ฐ๋ก ๋ชจ๋๋ก ๊ณ ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฐฉํฅ ๊ณ ์ ์ ๋๋ฌผ๊ฒ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ์ด์ ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ฐฉํฅ์ ๊ฐ์ ํ๋ ๊ฒ์ ์ข์ ๊ฐ์ ์ค ์ ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์์ต๋๋ค.
ํ๋ฉด ๋ฐฉํฅ์ ๊ณ ์ ํ๋ ๋ฐฉ๋ฒ
์๋๋ก์ด๋
์๋๋ก์ด๋์์๋ `AndroidManifest.xml` ํ์ผ์ `screenOrientation` ์์ฑ์ ์ค์ ํ์ฌ ํ๋ฉด ๋ฐฉํฅ์ ๊ณ ์ ํ ์ ์์ต๋๋ค:
<activity
android:name=".MyActivity"
android:screenOrientation="landscape"
... >
</activity>
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋ฐฉํฅ์ ๊ณ ์ ํ ์๋ ์์ต๋๋ค:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
iOS
iOS์์๋ `Info.plist` ํ์ผ์์ ์ง์๋๋ ๋ฐฉํฅ์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ํ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ `supportedInterfaceOrientations` ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscape
}
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ๋์์ธํ ๋, ํ๋ฉด ๋ฐฉํฅ๊ณผ ๊ด๋ จํ์ฌ ๋ค์ ์ฌํญ์ ์ผ๋์ ๋์ญ์์ค:
- ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ๋ ์ด์์: UI๊ฐ RTL ์ธ์ด์ ์ด๋ป๊ฒ ์ ์ํ ์ง ๊ณ ๋ คํ์ธ์. ์๋์ด์ ํ๋ธ๋ฆฌ์ด ๊ฐ์ ์ผ๋ถ ์ธ์ด๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์๋๋ค. RTL ๋ชจ๋์์ ๋ ์ด์์์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฏธ๋ฌ๋ง๋๋์ง ํ์ธํ์ธ์. ์คํ ๋ ์ด์์๊ณผ ConstraintLayout์ ์ข ์ข RTL ๋ ์ด์์์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- ๋ฌธํ์ ์ ํธ๋: ๊ธฐ๊ธฐ ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ๋ฌธํ์ ์ ํธ๋๋ฅผ ์ผ๋์ ๋์ธ์. ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ธ๋ก ๋ฐ ๊ฐ๋ก ๋ชจ๋ ๋ชจ๋์ ์ต์ํ์ง๋ง, ์ผ๋ถ ๋ฌธํ๊ถ์์๋ ๋ฏธ๋ฌํ ์ ํธ๋๊ฐ ์์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์์ ํ ์คํธํ๋ฉด ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
- ๋ค์ํ ์ฌ์ฉ์๋ฅผ ์ํ ์ ๊ทผ์ฑ: ํญ์ ์ ๊ทผ์ฑ์ ์ฐ์ ์ํ์ธ์. ํ๋ฉด ๋ฐฉํฅ์ ๊ด๊ณ์์ด ์ฅ์ ๊ฐ ์๋ ์ฌ๋๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์. ์ฌ๊ธฐ์๋ ์ด๋ฏธ์ง์ ๋ํ ๋์ฒด ํ ์คํธ ์ ๊ณต, ์ถฉ๋ถํ ์์ ๋๋น ๋ณด์ฅ, ๋ณด์กฐ ๊ธฐ์ ์ง์ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
ํ๋ฉด ๋ฐฉํฅ ์ฒ๋ฆฌ ํ ์คํธ
์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ๋ ค๋ฉด ์ฒ ์ ํ ํ ์คํธ๊ฐ ํ์์ ์ ๋๋ค. ๋ค์์ ํ ์คํธ๋ฅผ ์ํ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- ์๋ฎฌ๋ ์ดํฐ ๋ฐ ์ค์ ๊ธฐ๊ธฐ ์ฌ์ฉ: ๋ ๋์ ๋ฒ์์ ํ๋ฉด ํฌ๊ธฐ์ ํ๋์จ์ด ๊ตฌ์ฑ์ ๋ค๋ฃจ๊ธฐ ์ํด ์๋ฎฌ๋ ์ดํฐ์ ์ค์ ๊ธฐ๊ธฐ ๋ชจ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ธ์.
- ๋ค๋ฅธ ๋ฐฉํฅ์์ ํ ์คํธ: ์ธ๋ก ๋ฐ ๊ฐ๋ก ๋ฐฉํฅ, ๊ทธ๋ฆฌ๊ณ ์ง์๋๋ ๊ฒฝ์ฐ ์ญ ์ธ๋ก ๋ฐ ์ญ ๊ฐ๋ก ๋ฐฉํฅ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ธ์.
- ๋ค๋ฅธ ํ๋ฉด ํฌ๊ธฐ๋ก ํ ์คํธ: UI๊ฐ ์ ๋๋ก ํ์ฅ๋๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ฉด ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ๊ธฐ๊ธฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ธ์.
- ๋ค๋ฅธ ๊ธ๊ผด ํฌ๊ธฐ๋ก ํ ์คํธ: ํ ์คํธ๊ฐ ๊ณ์ ์ฝ๊ธฐ ์ฌ์ด์ง ํ์ธํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ธ๊ผด ํฌ๊ธฐ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ธ์.
- ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ด ํ์ฑํ๋ ์ํ์์ ํ ์คํธ: ํ๋ฉด ์ฝ๊ธฐ ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ ํ์ฑํํ ์ํ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ๊ณ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ธ์.
- ์๋ํ๋ ํ ์คํธ: ํ๋ฉด ๋ฐฉํฅ ๋ณ๊ฒฝ์ ๋ค๋ฃจ๋ ์๋ํ๋ UI ํ ์คํธ๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ ํ๊ท๋ฅผ ํฌ์ฐฉํ๊ณ ๋ฆด๋ฆฌ์ค ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
ํ๋ฉด ๋ฐฉํฅ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ชจ๋ฐ์ผ ๋ฐ ์น ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ๊ฐ ํ๋ซํผ์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๊ธฐ์ ์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ฌ์ฉ์๊ฐ ๊ธฐ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ์ก๊ณ ์๋ ๊ด๊ณ์์ด ์ํํ๊ณ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ด ๋๋๋ก ํ ์คํธ๋ฅผ ์ฐ์ ์ํ๊ณ ๋์์ธ ์ ํ์ ๊ธ๋ก๋ฒ ์ํฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.